Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++]Scrivere un metodo che prenda come parametri formali un array di stringhe A e restituisca in output un array B di m
Forum - C/C++ - [C++]Scrivere un metodo che prenda come parametri formali un array di stringhe A e restituisca in output un array B di m

Avatar
TTTuRiddo (Normal User)
Newbie


Messaggi: 1
Iscritto: 14/06/2015

Segnala al moderatore
Postato alle 16:02
Domenica, 14/06/2015
Ciao a tutti , ho alcuni problemi con questo esercizio e non riesco a venirne a capo . In pratica , quando alla fine cerco di stampare l'intero array di stringhe B ,stampa solamente un asterisco .
Qualcuno potrebbe aiutarmi a capire cosa ho sbagliato?
Ecco il testo completo:
Scrivere un metodo che prenda come parametri formali un array di stringhe A e restituisca in output
un array B di m stringhe, dove:
• m è la lunghezza media delle stringhe in A di lunghezza maggiore di 5, e
• la i-esima stringa di B è ottenuta concatenando (m*i) asterischi.

Codice sorgente - presumibilmente C#

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5.  
  6. string* output (string strA[], int size){
  7. int cont=0;
  8. int c=0;
  9. int m;
  10. for(int i=0;i<size;i++)
  11.     {
  12.     if(strA[i].length()>=5) { cont++; c+=strA[i].length();}
  13.     }
  14. m=c/cont;
  15. string *B=new string[m];
  16. string word;
  17. for(int i=0;i<m;i++)
  18.     {
  19.     for(int j=0;j<=(m*i);j++){ word+='*'; }
  20.     B[i]=word;
  21.     }
  22. return B;
  23. }
  24.  
  25.  
  26.  
  27.  
  28. int main(){
  29. int size;
  30.  
  31.  
  32.     cout<< "Quanto deve essere lungo l'array di stringhe?" <<endl;
  33.     cin >> size;
  34. string strA[size];
  35. cout<<"Scegli le stringhe che devono comporre l'array:"<<endl;
  36. for(int i=0; i<size;i++)
  37.     cin>> strA[i];
  38.  
  39.  
  40. cout<< "Array di stringhe"<<endl;
  41. for(int i=0; i<size;i++)
  42.     cout <<strA[i]<<endl;
  43. string *B =output(strA,size);
  44. cout<<"Array di stringhe in output:"<<endl;
  45. for(int i=0;i<B->size();i++)
  46.     cout<<B[i]<<endl;
  47. }


Ultima modifica effettuata da TTTuRiddo il 14/06/2015 alle 16:03
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:05
Martedì, 16/06/2015
Bug ben nascosto, ma presente.

Codice sorgente - presumibilmente C/C++

  1. for (int i = 0; i < B->size(); i++) {



B è inizializzato con:

Codice sorgente - presumibilmente C/C++

  1. string *B = new string[m];



Ma gli array in C++ non hanno un metodo size().

Quando invochi:

Codice sorgente - presumibilmente Plain Text

  1. B->size();



La funzione ritorna NON la lunghezza dell'array (m), bensì la lunghezza del primo elemento dell'array B[0]->size() (che è 1, quindi il for loop esce dopo la prima iterazione).

Questo è a causa del zucchero semantico del C++, dove B e B[0] corrispondono allo stesso elemento in termini di puntatore (base + 0 offset = base).

La soluzione è quella di usare vector<std::string> per contenere l'array di stringhe, oppure ritornare m dalla funzione output, oppure spostare il codice del for loop all'interno della funzione "output" e usare m invece di B->size().

Codice sorgente - presumibilmente C#

  1. string* output(string strA[], int size) {
  2.         int cont = 0;
  3.         int c = 0;
  4.         int m;
  5.         for (int i = 0; i<size; i++)
  6.         {
  7.                 if (strA[i].length() >= 5) { cont++; c += strA[i].length(); }
  8.         }
  9.         m = c / cont;
  10.  
  11.         string *B = new string[m];
  12.         string word;
  13.         cout << "Array di stringhe in output:" << endl;
  14.         for (int i = 0; i<m; i++)
  15.         {
  16.                 for (int j = 0; j <= (m*i); j++) { word += '*'; }
  17.                 B[i] = word;
  18.                 cout << B[i] << endl;
  19.         }
  20.  
  21.         return B;
  22. }


Ultima modifica effettuata da pierotofy il 16/06/2015 alle 0:07


Il mio blog: https://piero.dev
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 883
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:43
Martedì, 16/06/2015
Codice sorgente - presumibilmente C#

  1. #include<iostream>
  2.     #include<string>
  3.     using namespace std;
  4.  
  5. int ArrayLenght=0;
  6.  
  7.     string* output(string strA[], int size){
  8.     int cont=0;
  9.     int c=0;
  10.     int m;
  11.     for(int i=0;i<size;i++)
  12.         {
  13.         if(strA[i].length()>=5) { cont++; c+=strA[i].length();}
  14.         }
  15.     m=c/cont;
  16.     cout<<m<<endl;
  17.     string *B=new string[m];
  18.     string word;
  19.  
  20.     for(int i=0;i<m;i++)
  21.         {
  22.         for(int j=0;j<=(m*i);j++){ word+='*'; }
  23.         B[i]=word;
  24.         }
  25.         ArrayLenght=m;
  26.  
  27.     return B;
  28.     }
  29.  
  30.  
  31.  
  32.  
  33. int main(){
  34.  
  35.     int sized;
  36.         cout<< "Quanto deve essere lungo l'array di stringhe?" <<endl;
  37.         cin >> sized;
  38.     string strA[sized];
  39.     cout<<"Scegli le stringhe che devono comporre l'array:"<<endl;
  40.     for(int i=0; i<sized;i++)
  41.         cin>> strA[i];
  42.  
  43.  
  44.     cout<< "Array di stringhe"<<endl;
  45.     for(int i=0; i<sized;i++)
  46.         cout <<strA[i]<<endl;
  47.     string *B=output(strA,sized);
  48.  
  49.     cout<<"Array di stringhe in output:"<<endl;
  50.     for(int i=0;i<ArrayLenght;i++)
  51.         cout<<B[i]<<endl;
  52.         cout<<"lunghezza di B:"<<endl;
  53.         cout<<ArrayLenght<<endl;
  54.     }



inserendo una variabile di appoggio funziona


If ok Then GOTO Avanza else GOTO Inizia

PM Quote